﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Security;
using System.Web.Mvc;
using EventPlanner.Models;
using EventPlanner.DAL;
using EventPlanner.Performance;

namespace EventPlanner.Controllers
{
    [CompressFilter(Order = 1)]
    [CacheFilter(Duration = 60, Order=2)]
    public class ParticipanteController : Controller
    {
        private IEventPlannerContext db;

        public ParticipanteController()
        {
            this.db = new EventPlannerContext();
        }

        /* ParticipanteController(context): constructor utilizado para realizar los tests 
         * correspondientes al controlador.*/

        public ParticipanteController(IEventPlannerContext context)
        {
            this.db = context;
        }

        //
        // GET: /Participante/

        /* VerParticipantes: llena una tabla con todos los participantes inscriptos en un evento
         * en particular, este último, creado por el usuario dueño de la cuenta actual. */

        [Authorize]
        public ActionResult VerParticipantes(int id_evento)
        {
            MembershipUser UsuarioActual = Membership.GetUser();
            Cuenta cuenta = db.Cuentas.Find(UsuarioActual.UserName);
            Evento evento = db.Eventos.Find(id_evento);
            if (cuenta.Eventos.Contains(evento))
            {
                ViewBag.Nombre = evento.Nombre;
                return View(evento.Participantes.ToList());
            }
            else
            {
                return RedirectToAction("Mensaje_Acceso_denegado", "Autorizacion", new { msj = "Participante/VerParticipantes/" + id_evento });
            }
        }


        /* RegistracionExitosa: muestra una vista con el mensaje de la registracion exitosa del participante
         * al evento. */

        public ViewResult RegistracionExitosa()
        {
            return View();
        }

        /* EliminarInscripcion: borra la inscripcion del participante a un evento en particular. */

        public ActionResult EliminarInscripcion(string email, int id)
        {
            Evento evento = db.Eventos.Find(id);
            return View(evento);
        }

        [HttpPost, ActionName("EliminarInscripcion")]
        public ActionResult EliminacionConfirmada(string email, int id)
        {
            Evento evento = db.Eventos.Find(id);
            Participante participante = db.Participantes.Find(email);
            
            participante.Eventos.Remove(evento);
            evento.Participantes.Remove(participante);
            db.SaveChanges();
            return RedirectToAction("ListaParticipante", "Evento");
            
        }

        //
        // GET: /Participante/Inscripcion

        /* Inscripcion: crea un nuevo participante en la base de datos(si es que no se ha registrado
         * anteriormente en un evento) y lo inscribe en un evento determinado. En caso de anteriormente
         ya haberse registrado en algun evento, solo realiza la inscripcion del*/

        public ActionResult Inscripcion(int id_evento)
        {
            return View();
        } 

        //
        // POST: /Participante/Inscripcion

        [HttpPost]
        public ActionResult Inscripcion(Participante participante, int id_evento)
        {
            if (ModelState.IsValid)
            {
                Participante part = db.Participantes.Find(participante.Email);
                Evento evento = db.Eventos.Find(id_evento);

                if (part != null)  
                {
                    // El participante ya esta registrado en el sistema(en algun evento)
                    if (part.Eventos.Contains(evento))
                    {
                        // El participante ya esta registrado en el evento seleccionado
                        return RedirectToAction("EliminarInscripcion", new { email=participante.Email, id=id_evento });
                    }
                    else
                    {
                        // El participante no esta registrado en el evento seleccionado
                        part.Eventos.Add(evento);
                        db.SaveChanges();
                    }
                }
                else
                {
                    // El participante no esta registrado en el sistema
                    participante.Eventos = new List<Evento>();
                    participante.Eventos.Add(evento);
                    db.Participantes.Add(participante);
                    db.SaveChanges();
                }
                return RedirectToAction("RegistracionExitosa");
            }

            return View(participante);
        }


        protected override void Dispose(bool disposing)
        {
            if (db is IDisposable)
            {
                ((IDisposable)db).Dispose();
            }
            base.Dispose(disposing);
        }
    }
}